package dao;

import entity.User;  // 导入用户户信息的模板
import util.DatabaseUtil;  // 导入数据库工具类
import java.sql.*;  // 导入操作数据库的相关工具
import java.util.ArrayList;  // 导入ArrayList一堆用户的容器
import java.util.List;

public class UserDAOImpl implements UserDAO {

    /**
     * 添加新用户（用户注册的时候就会调用这个方法）
     */
    @Override
    public boolean addUser(User user) {
        // 往users表插数据
        String sql = "INSERT INTO users (username, password, phone, email) VALUES (?, ?, ?, ?)";

        // 试着连接数据库
        try (Connection conn = DatabaseUtil.getConnection();

             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            pstmt.setString(1, user.getUsername());
            pstmt.setString(2, user.getPassword());
            pstmt.setString(3, user.getPhone());
            pstmt.setString(4, user.getEmail());

            // 执行插入操作，返回受影响的行数
            int affectedRows = pstmt.executeUpdate();
            // 如果有行数受影响，就说明成功了
            return affectedRows > 0;

        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 根据用户ID查用户（比如想查ID=1的用户是谁）
     */
    @Override
    public User getUserById(int userId) {
        // 查users表里user_id等于指定值的记录
        String sql = "SELECT * FROM users WHERE user_id = ?";
        User user = null;  // 先初始化一个空用户

        try (Connection conn = DatabaseUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            // 填要查的用户ID
            pstmt.setInt(1, userId);
            // 执行查询，得到结果
            ResultSet rs = pstmt.executeQuery();

            // 如果结果集里有数据（说明查到了）
            if (rs.next()) {
                user = new User();  // 新建一个用户对象
                // 把结果集里的数据一个个塞进用户对象里（字段名要和数据库表对应）
                user.setUserId(rs.getInt("user_id"));
                user.setUsername(rs.getString("username"));
                user.setPassword(rs.getString("password"));
                user.setPhone(rs.getString("phone"));
                user.setEmail(rs.getString("email"));
                user.setRegisterDate(rs.getTimestamp("register_date"));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }

        return user;  // 返回查到的用户（没查到就是null）
    }

    /**
     * 根据用户名查用户（比如登录时验证用户名是否存在）
     */
    @Override
    public User getUserByUsername(String username) {
        // 查users表里username等于指定值的记录
        String sql = "SELECT * FROM users WHERE username = ?";
        User user = null;

        try (Connection conn = DatabaseUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            pstmt.setString(1, username);  //填要查的用户名
            ResultSet rs = pstmt.executeQuery();

            if (rs.next()) {  // 如果查到了
                user = new User();
                // 把结果数据塞进用户对象
                user.setUserId(rs.getInt("user_id"));
                user.setUsername(rs.getString("username"));
                user.setPassword(rs.getString("password"));
                user.setPhone(rs.getString("phone"));
                user.setEmail(rs.getString("email"));
                user.setRegisterDate(rs.getTimestamp("register_date"));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }

        return user;
    }

    /**
     * 更新用户信息（比如改密码、手机号）
     */
    @Override
    public boolean updateUser(User user) {
        // 更新users表，根据user_id改密码、手机、邮箱
        String sql = "UPDATE users SET password = ?, phone = ?, email = ? WHERE user_id = ?";

        try (Connection conn = DatabaseUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            pstmt.setString(1, user.getPassword());
            pstmt.setString(2, user.getPhone());
            pstmt.setString(3, user.getEmail());
            pstmt.setInt(4, user.getUserId());

            // 执行更新，返回受影响的行数
            int affectedRows = pstmt.executeUpdate();
            return affectedRows > 0;

        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 删除用户（根据用户ID删）
     */
    @Override
    public boolean deleteUser(int userId) {
        // 删除users表里user_id等于指定值的记录
        String sql = "DELETE FROM users WHERE user_id = ?";

        try (Connection conn = DatabaseUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            pstmt.setInt(1, userId);  // 填要删的用户ID
            int affectedRows = pstmt.executeUpdate();
            return affectedRows > 0;

        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 获取所有用户（比如管理员想看看系统里有哪些用户）
     */
    @Override
    public List<User> getAllUsers() {
        List<User> users = new ArrayList<>();  // 准备一个容器装所有用户
        String sql = "SELECT * FROM users";  //查users表里所有记录

        try (Connection conn = DatabaseUtil.getConnection();
             // 简单的Statement就行，因为没有参数（不需要防注入）
             // 这个我没太懂其实
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery(sql)) {

            // 循环取结果里的每一行数据
            while (rs.next()) {
                User user = new User();
                // 把数据塞进用户对象
                user.setUserId(rs.getInt("user_id"));
                user.setUsername(rs.getString("username"));
                user.setPassword(rs.getString("password"));
                user.setPhone(rs.getString("phone"));
                user.setEmail(rs.getString("email"));
                user.setRegisterDate(rs.getTimestamp("register_date"));
                users.add(user);  // 把用户放进容器
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }

        return users;  // 返回装着所有用户的容器
    }

    /**
     * 验证用户名和密码（登录时用，检查输入的账号密码对不对）
     */
    @Override
    public boolean validateUser(String username, String password) {
        //查有没有用户名和密码都匹配的记录
        String sql = "SELECT * FROM users WHERE username = ? AND password = ?";

        try (Connection conn = DatabaseUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            pstmt.setString(1, username);  // 填输入的用户名
            pstmt.setString(2, password);  // 填输入的密码
            ResultSet rs = pstmt.executeQuery();

            // 如果结果里有数据，说明账号密码对了
            return rs.next();

        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
    }
}